#include"Seqlist.h"
//初始化,扩容和销毁：
void SLInit(SL* ps){
    ps->arr = NULL;
    ps->size = ps->capacity=0;
}

void SLCheckCapacity(SL* ps){
    if (ps->size == ps->capacity){  //当数据量和总容量相等时说明已填满，需要扩容
        int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;   
        //如果capacity是0，则给四个空间 如果不是0则原有空间翻倍
        SLDataType* tmp = (SLDataType*)realloc(ps->arr,newCapacity * sizeof(SLDataType));
        //创建一个临时变量来储存开辟后的新空间
        if (tmp == NULL){
            perror("realloc fail!");
            exit(1);
        }
        //若不退出说明扩容成功
        ps->arr = tmp;
        ps->capacity = newCapacity;
    }
}

//顺序表的尾插/头插法
void SLPushBack(SL* ps,SLDataType x){
    //先判断传入的指针是否为空
    //可以用assert
    //assert(ps != NULL);
    assert(ps);

    //或者用if 
    //if(ps == NULL){
    //    return;
    //}

    //空间不够就扩容
    SLCheckCapacity(ps);
    //空间够就直接插入
    ps->arr[ps->size++] = x;
}

void SLPushFront(SL* ps,SLDataType x){
    assert(ps);
    SLCheckCapacity(ps);
    for(int i = ps->size-1;i >= 0;i--)
    ps->arr[i+1] = ps->arr[i];
    ps->arr[0] = x;
    ps->size++;  //不要忘记这一步
}

//顺序表的尾部/头部删除
void SLPopBack(SL* ps){
    assert(ps);
    assert(ps->size);

    ps->size--;
}

void SLPopFront(SL* ps){
    assert(ps);
    assert(ps->size);

    for(int i = 0;i < ps->size-1;i++){
        ps->arr[i] = ps->arr[i+1]; 
    }
    ps->size--;
}

//指定位置之前插入数据
void SLInsert(SL* ps,int pos,SLDataType x){
    assert(ps);
    assert(pos >= 0 && pos <= ps->size);

    SLCheckCapacity(ps);

    //pos及之后的数据后挪一位
    for(int i = ps->size;i > pos;i--){
        ps->arr[i] = ps->arr[i-1];
    }
    ps->arr[pos] = x;
    ps->size++;
}

//删除指定位置的数据
void SLErase(SL* ps, int pos) {
	assert(ps);
	assert(pos >= 0 && pos < ps->size); 

	//pos以后的数据往前挪动一位
	for (int i = pos;i < ps->size-1;i++)
	{
		ps->arr[i] = ps->arr[i + 1];//ps->arr[i-2] = ps->arr[i-1];
	}
	ps->size--;
}

void SLPrint(SL* ps) {
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}